<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        window.toString = function () {
            console.log('我是toString')
            return '3'
        }
        // // console.log(toString())
        // let num=1

        // console.log(num.toString(),'内容');
        // console.log(num)
        // console.log(window.toString,'方法');
        // console.log(typeof num,'类型');
        // 只涉及引用类型
        var obj1 = {
            a: 1,
            // toString: function () {
            //     console.log('toString1')
            //     return '2'
            // },
            valueOf: function () {
                console.log('valueOf2')
                return 3
            }
        }
        console.log(obj1 == '2','valueOf false'); //依次输出 'valueOf' false
        console.log(String(obj1),'toString 2');//依次输出 'toString' '2'

        var obj = {
            a: 1,
            toString: function () {
                console.log('toString')
                return '2'
            },
            valueOf: function () {
                console.log('valueOf')
                return {} //修改为对象
            }
        }
        console.log(obj == '2'); //依次输出 'valueOf' 'toString' true
        console.log(Number(obj));//依次输出 'valueOf' 'toString' 2

        // 在相等运算符的操作中，对象会先调用valueOf 如果返回的值时一个对象，就会调用toString
        // null 除外 然后用返回的值进行比较，第一个列子相当于 3=='2'输出false 
        // 第二个例子由于执行valueOf返回的是一个对象，然后执行toString ，最后相当于'2'='2' 输出true 
        // 在Number和String方法中Number会先调用ValueOf 后调用toString，String方法中是相反的
        // 数据类型的转换除了上面的两个例子外，还会存爱各种其他操作中，如数值运算，当涉及到引用类型时，都会调用
        // valueOf或tostring方法。只要是对象都会继承这两个方法，我们可以重新覆盖这两个方法，从而影响数据类型转换的行为


        var eventObj = {
            a: 1,
            handleEvent: function (e) {
                console.log(this, e);//返回 eventObj 和 事件对象
                alert(this.a)
            }
        }
        document.addEventListener('click', eventObj)
        // addEventListener 第二个参数除了函数外还可以是一个对象, 事件触发后会执行对象的handleEvent方法,方法执行时的this指向eventObj, 你可以把想传入的数据绑定在eventObj对象上
    </script>
</body>

</html>